home *** CD-ROM | disk | FTP | other *** search
/ Best of www.BestZips.com (Collector's Edition) / Best of WWW.BESTZIPS.COM Collector's Edition (JCSM Shareware) (JCS Marketing).ISO / gamebord / wak02.zip / WAK.C < prev    next >
C/C++ Source or Header  |  1996-06-22  |  8KB  |  274 lines

  1. /***************************************************************************
  2.                                        W A K
  3.                               WORD "TACHISTOSCOPE"
  4.  
  5.                                      M\Cooper
  6.                                     PO Box 237
  7.                               St. David, AZ 85630-0237
  8.                            -------------------------------
  9.                            E-mail: thegrendel@theriver.com
  10.  
  11. ****************************************************************************/
  12.  
  13.  
  14. #include <stdio.h>
  15. #include <time.h>
  16. #include <conio.h>
  17. #include <stdlib.h>
  18. #include <string.h>
  19. #include <graphics.h>
  20. #include <ctype.h>
  21. #include <dos.h>
  22. #include "scrn2.h"
  23. #include "wak.h"
  24.  
  25.  
  26. void main( int argc, char **argv )
  27. {
  28.    char Filename [FILENAMELEN ],
  29.         av = 'X';
  30.    struct Stats stats;
  31.    struct Parameters dParams;
  32.  
  33.       randomize();
  34.       opening_screen();
  35.  
  36.  
  37.       if( argc > MIN_ARG_CNT )
  38.          av = *( *(argv + 1) );
  39.  
  40.       if( av == DEFAULT1 || av == DEFAULT2 )
  41.              {
  42.              dParams = set_defaults();
  43.              strcpy( Filename, dParams.filename );
  44.              }
  45.        else
  46.          { 
  47.          dParams = param_screen();
  48.          strcpy( Filename, dParams.filename );
  49.          }
  50.  
  51.       if( dParams.cdnscr )
  52.          countdown_screen();
  53.  
  54.       graphics_setup( WHITE );
  55.       top_display();
  56.       bottom_display();
  57.  
  58.       stats = getword( dParams );
  59.  
  60.       exit__( stats );
  61. }
  62.  
  63. void display_word( char *word )
  64. {
  65.  
  66.       settextstyle( SANS_SERIF_FONT, HORIZ_DIR, TEXT_SIZE );
  67.       settextjustify( CENTER_TEXT, TOP_TEXT );
  68.  
  69.       setcolor( LIGHTRED );
  70.       outtextxy( X_COORD, Y_COORD, word );
  71.  
  72.       return;
  73. }
  74.  
  75.  
  76. void erase( char *txt, int fontname, int fontsize, int xcoord, int ycoord )
  77. {
  78.  
  79.       settextstyle( fontname, HORIZ_DIR, fontsize );
  80.       settextjustify( CENTER_TEXT, TOP_TEXT );
  81. //                    ===========
  82.       setcolor( BACKGROUND_COLOR ); //BLUE for debug
  83.       outtextxy( xcoord, ycoord, txt );
  84.  
  85.       return;
  86. }
  87.  
  88. void exit__( struct Stats st )
  89. {
  90.    float freq;
  91.  
  92.       closegraph();
  93.  
  94.       printf( "\nSTATISTICS FOR THIS RUN\n" );
  95.       printf( "\nYou looked at %ld words.", st.wds );
  96.       printf( "\nTime elapsed is %d:", st.minutes );
  97.       printf( "%02d.", st.seconds );
  98.  
  99.       printf( "\n\nThe final \"time delay constant\" was %d/1000 sec.",
  100.               st.interval );
  101.       freq = (float)st.wds / (float)st.total_seconds;
  102.       printf( "\nInitial display speed setting was %4.2f \"speed units\".",
  103.               st.requested_freq );
  104.       printf( "\n*Final* display speed setting was %4.2f \"speed units\".",
  105.               st.frequency );
  106.       printf( "\nThe final display =frequency= was %4.2f words/second.\n\n", 
  107.                freq );
  108.  
  109.       exit( QUIT );
  110. }
  111.  
  112.  
  113. struct Stats getword( struct Parameters params )
  114. {
  115.    char word [MAXWORDLEN],
  116.         ch;
  117.    FILE *wfp;      
  118.    struct Stats statistics;
  119.    time_t starting_time;
  120.    Boolean Adv_Flag = FALSE;
  121.  
  122.       statistics.wds = 0L;
  123.       statistics.interval = FREQ2PERIOD / params.frequency;
  124.       statistics.total_seconds = 0;
  125.       statistics.requested_freq = params.frequency;
  126.       starting_time = time( NULL ); //Start clock.
  127.  
  128.       wfp = fopen( params.filename, "r" );
  129.  
  130.       
  131.  
  132.       while( !feof( wfp)
  133.              && statistics.wds < params.maxwords
  134.              && statistics.total_seconds < params.maxtime ) 
  135.          {
  136.          if( kbhit() )
  137.             {
  138.             ch = getch();
  139.  
  140.             if( ch == ESC )
  141.                 break;
  142.             if( ch == 'f' && statistics.interval > INCREMENT )
  143.                statistics.interval -= INCREMENT;
  144.             if( ch == 'F' && statistics.interval > BIG_INCREMENT )
  145.                statistics.interval -= BIG_INCREMENT;
  146.             if( ch == 's' && statistics.interval < MAXINTERVAL )
  147.                statistics.interval += INCREMENT;
  148.             if( ch == 'S' && statistics.interval < MAXINTERVAL )
  149.                statistics.interval += BIG_INCREMENT;
  150.             if( ch == '>'  || ch == '.' || ch == ' ' ) //FF Keys
  151.                Adv_Flag = TRUE;  // Fast Forward!
  152.  
  153.             statistics.frequency = FREQ2PERIOD / statistics.interval;
  154.             }    
  155.  
  156.          fgets( word, MAXWORDLEN - 1, wfp );
  157.          strupr( word );          //Convert to u/c
  158.          if( Adv_Flag ) //Fast Forward?
  159.             {
  160.             Adv_Flag = FALSE; //Turn off FF     ZZZZZZZZZZ
  161.             fseek( wfp, ADVANCEDIST, SEEK_CUR );
  162.             if( ftell( wfp) == PAST_EOF )
  163.                break;  // Don't wanna go past EOF, ha, ha.
  164.             fgets( word, MAXWORDLEN, wfp );     //Discard word fragment
  165.             if( feof( wfp ) )
  166.                break; // Got the "last word" in?
  167.             strcpy( word, FFSYMBOL );
  168.             }
  169.          display_word( word );
  170.          delay( statistics.interval );       //How long to display word
  171.          erase( word, SANS_SERIF_FONT, TEXT_SIZE, X_COORD, Y_COORD );
  172.          statistics.frequency = FREQ2PERIOD / statistics.interval;
  173.          statistics.total_seconds = time( NULL) - starting_time;
  174.          statistics.minutes = statistics.total_seconds / 60;
  175.          statistics.seconds = statistics.total_seconds % 60;
  176.          statistics.wds++;
  177.  
  178.          top_stats( statistics );
  179.          }
  180.  
  181.       fclose( wfp );
  182.  
  183.       return( statistics );
  184. }
  185.  
  186.  
  187. void top_display()
  188. {
  189.       setcolor( TOP_COLOR );
  190.       line( TX1, TY1, TX2, TY2 );
  191.  
  192.       settextstyle( TRIPLEX_FONT, HORIZ_DIR, SMALL_TEXT_SIZE );
  193.       settextjustify( LEFT_TEXT, TOP_TEXT );
  194.  
  195.       outtextxy( TMX, TMY, TMWORD );
  196.       outtextxy( TRX, TRY, TRWORD );
  197.  
  198.       return;
  199. }
  200.  
  201. void bottom_display()
  202. {
  203.       setcolor( BOTTOM_COLOR );
  204.       line( BX1, BY1, BX2, BY2 );
  205.  
  206.       settextstyle( TRIPLEX_FONT, HORIZ_DIR, SMALL_TEXT_SIZE );
  207.       settextjustify( LEFT_TEXT, TOP_TEXT );
  208.  
  209.       outtextxy( BLX, BLY, LWORD );
  210.       outtextxy( BMX, BMY, MWORD );
  211.       outtextxy( BRX, BRY, RWORD );
  212.  
  213.       return;
  214. }
  215.  
  216. char *top_stats( struct Stats topstats )
  217. {
  218.    static char words      [NUMLEN],
  219.           frequency       [NUMLEN],
  220.           time            [NUMLEN];
  221.  
  222.    static float prev_freq;
  223.    static time_t prev_time;
  224.  
  225.       if( topstats.wds ) //If number of words > 0, only...
  226.          {
  227.          erase( words,
  228.                 TRIPLEX_FONT, SMALL_TEXT_SIZE, TMX - TOFFSET, TMY );
  229.          if( topstats.frequency != prev_freq )
  230.             erase( frequency,
  231.                 TRIPLEX_FONT, SMALL_TEXT_SIZE, TRX - TOFFSET - TROFFSET, TMY );
  232.  
  233.          if( topstats.total_seconds != prev_time )
  234.             {
  235.             if( topstats.total_seconds > 1 && ( topstats.seconds % 10 ) )
  236.                erase( time + 4,
  237.                       TRIPLEX_FONT, SMALL_TEXT_SIZE, TLX + TCOMPOFFSET, TLY );
  238.             else
  239.                erase( time,
  240.                       TRIPLEX_FONT, SMALL_TEXT_SIZE, TLX, TLY );
  241.             }
  242.  
  243.          setcolor( TOP_COLOR ); 
  244.  
  245.          settextstyle( TRIPLEX_FONT, HORIZ_DIR, SMALL_TEXT_SIZE );
  246.          settextjustify( CENTER_TEXT, TOP_TEXT );
  247.  
  248.          sprintf( words, "%ld", topstats.wds );
  249.          outtextxy( TMX - TOFFSET, TMY, words );
  250.  
  251.          if( topstats.frequency != prev_freq )
  252.             {
  253.             sprintf( frequency, "%3.2f", topstats.frequency );
  254.             outtextxy( TRX - TOFFSET - TROFFSET, TRY, frequency );
  255.             }
  256.  
  257.          if( topstats.total_seconds != prev_time )
  258.             {
  259.             sprintf( time, "%02d:%02d", topstats.minutes, topstats.seconds );
  260.  
  261.             if( topstats.total_seconds > 1 && ( topstats.seconds % 10 ) )
  262.                outtextxy( TLX + TCOMPOFFSET, TLY, time + 4 );
  263.             else
  264.                outtextxy( TLX, TLY, time );
  265.             }
  266.  
  267.          }
  268.  
  269.       prev_freq = topstats.frequency;
  270.       prev_time = topstats. total_seconds;
  271.  
  272.       return ( words );
  273. }
  274.